/**
*Central de comunicaciones
*@autor: T-complement
*@version: 1.0
*@fecha:15 de Junio de 2009
*/

package mnTaxSimula;

import java.util.ArrayList;
import java.util.Random;
import mdTaxSimula.CentralComunicacionesBD;
import mdTaxSimula.TaxiBD;

public class CentralComunicaciones {

    private String nombre;
    private int cantidadServiciosNoAsignados;
    private ArrayList<PlacasServicios> taxisCercanos;
    private ArrayList<Integer> numerosGenerados;
    private ArrayList<PlacasServicios> taxisReporte;
    private ArrayList<Usuario> listaUsuarios;
    private ArrayList<Taxi> listaTaxis;
    private CentralComunicacionesBD centralComunicacionesBD;
    private TaxiBD taxisBD;

    public CentralComunicaciones() {
        taxisCercanos = new ArrayList<PlacasServicios>();
        numerosGenerados = new ArrayList<Integer>();
        taxisReporte = new ArrayList<PlacasServicios>();
        listaUsuarios = new ArrayList<Usuario>();
        listaTaxis = new ArrayList<Taxi>();
        centralComunicacionesBD = new CentralComunicacionesBD();
        taxisBD = new TaxiBD();
    }

    /**
    * Método que hace un llamado al método cargarNombre de la clase
    * CentralComunicacionesBD para que para que retorne el Nombre de la central,
    * y se lo asigno a la varibla nombre se esta clase
    * @param
    * @pre
    * @pos
    * @exception
    */
    public void asignarNombre(){
        //****nombre = centralComunicacionesBD.cargarNombre();
    }

    /**
    * Método que crea un array de taxis teniendo en cuenta la cantidad de taxis
    * que va a participar en la simulación
    * @param cantidadTaxis: cantidad de taxis que se deben crear
    * @param cantidadCalles: cantidad de calles que tiene la ciudad
    * @param cantidadCarreras: cantidad de carreras que tiene la ciudad
    * @pre
    * @pos
    * @exception
    */
    public void crearTaxis(int cantidadTaxis, int cantidadCalles, int cantidadCarreras){
       int i=0;
       String placaTaxi = "";
        /*while(i < cantidadTaxis){
            int indiceTaxi= numeroAleatorio(cantidadTaxis);
            Boolean c = validarNumeroAleatorio(indiceTaxi);
            if (c == false)
            {
                //**********String placaTaxi = taxisBD.cargarPlacaTaxi(indiceTaxi);
                placaTaxi = "AA"+i+"";
                asignarDireccionInicialTaxi(cantidadCalles, cantidadCarreras, placaTaxi);
                numerosGenerados.add(indiceTaxi);
                //*********Para ensayar
                System.out.println("placa"+listaTaxis.get(i).getPlaca()+ "calle"+ listaTaxis.get(i).getCalle() + "carrera" + listaTaxis.get(i).getCarrera());
                i++;
            }*/

        for(i=0; i<cantidadTaxis; i++)
        {
            placaTaxi = "AA"+i+"";
            asignarDireccionInicialTaxi(cantidadCalles, cantidadCarreras, placaTaxi);
            System.out.println("placa"+listaTaxis.get(i).getPlaca()+ "calle"+ listaTaxis.get(i).getCalle() + "carrera" + listaTaxis.get(i).getCarrera());
        }
    }

    /**
    *
    * @param
    * @pre
    * @pos
    * @exception
    */
    public Usuario seleccionarUsuario() {
        Usuario usuario = new Usuario();
        return usuario;
    }

    /**
    * Método que retorna un número aleatorio entre cero y el número limiteSuperior
    * @param limiteSuperior: Valor máximo que se puede generar
    * @pre
    * @pos
    * @exception
    */
    private int numeroAleatorio(int limiteSuperior){
        int temp=0;
        Random numeroAleatorio = new Random();
        while(temp == 0)
        {
            temp= (int)(numeroAleatorio.nextInt(limiteSuperior+1));
        }
        return temp;
    }

    /**
    * Método que valida que el número que entra por parametro para saber si en necesario
    * generar un nuevo número aleatorio
    * @param numero: numero aleatorio que entra por parametro
    * @pre
    * @pos
    * @exception
    */
    private boolean validarNumeroAleatorio(int numero){
        for(int i=0; i< numerosGenerados.size(); i++){
            if(numerosGenerados.get(i).intValue() == numero){
                return true;
            }
        }
        return false;
    }

    /**
    * Método que asigna una dirección un taxi teniendo en cuenta que esta dirección no
    * puede superar el número de la calle y carrera que llega por parametro
    * @param cantidadCalles: cantidad de calles que tiene la ciudad
    * @param cantidadCarreras: cantidad de carreras que tiene la ciudad
    * @pre
    * @pos
    * @exception
    */
    private void asignarDireccionInicialTaxi(int cantidadCalles, int cantidadCarreras, String placaTaxi){
        int calleTemporal;
        int carreraTemporal;
        calleTemporal= numeroAleatorio(cantidadCalles);
        carreraTemporal=numeroAleatorio(cantidadCarreras);
        if((validarUbicacion(calleTemporal, carreraTemporal))==false){
            Taxi taxi= new Taxi(placaTaxi,calleTemporal, carreraTemporal,false,false);
            listaTaxis.add(taxi);
        }
    }

    /**
    * Método que valida que en la ubicación que se le va ha asignar al taxi,
    * no este ya ocupada por otro método
    * @param cantidadCalles: cantidad de calles que tiene la ciudad
    * @param cantidadCarreras: cantidad de carreras que tiene la ciudad
    * @pre
    * @pos
    * @exception
    */
    private boolean validarUbicacion(int calle, int carrera){
        for(int i=0; i<listaTaxis.size();i++){
            if(listaTaxis.get(i).getCalle()==calle && listaTaxis.get(i).getCarrera()==carrera){
                return true;
            }
        }
        return false;
    }

    /**
    * Método que retorna un arryList de Taxi
    * @param
    * @pre
    * @pos
    * @exception
    */
   public ArrayList<Taxi>  getTaxis(){
        return listaTaxis;
    }

    /**
    * Método que cambia la ubicación de un taxi, haciendo uso del método
    * cambiarUbicacion de la calse taxi
    * taxi
    * @param
    * @pre
    * @pos
    * @exception
    */
    public ArrayList<Taxi> actualizarUbicacionTaxi(int cantidadCalles, int cantidadCarreras){
        int i=0;
        while( i<listaTaxis.size()){
            listaTaxis.get(i).cambiarUbicacion(cantidadCalles, cantidadCarreras);
            if(validarUbicacion(listaTaxis.get(i).getCalle(),listaTaxis.get(i).getCarrera())==false){
                i++;
            }
        }
        return listaTaxis;
    }

    /**
    * Método que retorna un Taxi
    * @param
    * @pre
    * @pos
    * @exception
    */
   /* public Taxi getTaxi(){

    }*/
}
